/*
 * This file is part of aion-engine <aion-engine.com>
 *
 * aion-engine is private software: you can redistribute it and or modify
 * it under the terms of the GNU Lesser Public License as published by
 * the Private Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * aion-engine is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser Public License for more details.
 *
 * You should have received a copy of the GNU Lesser Public License
 * along with aion-engine.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.aionengine.gameserver.model.team2.common.events;

import com.aionengine.gameserver.model.gameobjects.player.Player;
import com.aionengine.gameserver.model.team2.TeamMember;
import com.aionengine.gameserver.model.team2.TemporaryPlayerTeam;
import com.aionengine.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE;
import com.aionengine.gameserver.utils.PacketSendUtility;

/**
 * @author ATracer
 */
public class TeamKinahDistributionEvent<T extends TemporaryPlayerTeam<? extends TeamMember<Player>>> extends AbstractTeamPlayerEvent<T> {

    private final long amount;
    private long rewardPerPlayer;
    private long teamSize;

    public TeamKinahDistributionEvent(T team, Player distributor, long amount) {
        super(team, distributor);
        this.amount = amount;
    }

    @Override
    public boolean checkCondition() {
        return team.hasMember(eventPlayer.getObjectId());
    }

    @Override
    public void handleEvent() {
        if (eventPlayer.getInventory().getKinah() < amount) {
            // TODO retail message ?
            return;
        }

        teamSize = team.onlineMembers();
        if (teamSize <= amount) {
            rewardPerPlayer = amount / teamSize;
            if (eventPlayer.getInventory().tryDecreaseKinah(amount)) {
                team.applyOnMembers(this);
            }
        }
    }

    @Override
    public boolean apply(Player member) {
        if (member.isOnline()) {
            member.getInventory().increaseKinah(rewardPerPlayer);
            if (member.equals(eventPlayer)) {
                PacketSendUtility.sendPacket(member, new SM_SYSTEM_MESSAGE(1390247, amount, teamSize, rewardPerPlayer));
            } else {
                PacketSendUtility.sendPacket(member, new SM_SYSTEM_MESSAGE(1390248, eventPlayer.getName(), amount, teamSize,
                        rewardPerPlayer));
            }
        }
        return true;
    }

}
